<?php

class CarrinhoModel extends GenericModel {
  public function __construct() {
    parent::__construct();
  }
  
  public function criarPedido($objPedido) {
    $this -> transaction();
    try {
      $sqlQuery = "INSERT INTO tb_pedido(
        id_status, 
        id_cliente, 
        id_restaurante, 
        dt_pedido, 
        tempo_entrega, 
        retirada, 
        session_id) 
        VALUES(1, :id_cliente, :id_restaurante, NOW(), (SELECT tempo_entrega FROM tb_restaurante WHERE id=:id_restaurante), 0, :session_id);";
      $this -> execute($sqlQuery, $objPedido);
      $ret = $this -> getLastInsertId();
      $sqlQuery = "INSERT INTO tb_historico_status_pedido VALUES (null, ?, 1, NOW(), null);";
      $this->execute($sqlQuery, array($ret));
      $this->commit();
    } catch(Exception $err) {
        $this->rollback();
      $ret = $err;
    }
    return $ret;
  }

  public function atualizarProdutoCarrinho($objProduto) {
    $this -> transaction();
    try {
      $variacoes = $objProduto['variacoes'];
      unset($objProduto['variacoes']);
      $sqlQuery = "UPDATE tb_produto_pedido 
                  SET 
                    preco_unitario = :preco, 
                    qtde = :qtde, 
                    observacoes = :observacoes, 
                    alterado = NOW() 
                  WHERE id = :id_produto_pedido;";
      
      $this -> execute($sqlQuery, $objProduto);
      
      $this->execute("DELETE FROM tb_variacao_produto_pedido WHERE id_produto_pedido = ?;", array($objProduto['id_produto_pedido']));
      
      foreach ($variacoes as $variacao) {
        $this -> execute("INSERT INTO 
                    tb_variacao_produto_pedido (
                                  id_produto_pedido, 
                                  id_variacao, 
                                  id_item_variacao, 
                                  dif_preco
                                  )
                  VALUES($id, $variacao[0], $variacao[1], (SELECT dif_preco FROM tb_item_variacao WHERE id = $variacao[1]))");
      }

      $this -> commit();
      $ret = 1;
    } catch(Exception $err) {
      $ret = $err;
      $this -> rollback();
    }
    return $ret;
  }

  public function adicionarProdutoCarrinho($objProduto) {
    $this -> transaction();
    try {
      $variacoes = $objProduto['variacoes'];
      unset($objProduto['variacoes']);
      $sqlQuery = "INSERT INTO tb_produto_pedido (id_pedido, id_produto, preco_unitario, qtde, observacoes, criado, alterado)
     VALUES (:id_pedido, :id_produto, :preco, :qtde, :observacoes, NOW(), NOW())";
      $ret = $this -> execute($sqlQuery, $objProduto);

      $id = $this -> getLastInsertId();

      foreach ($variacoes as $variacao) {
        $this -> execute("INSERT INTO 
                    tb_variacao_produto_pedido (
                                  id_produto_pedido, 
                                  id_variacao, 
                                  id_item_variacao, 
                                  dif_preco
                                  )
                  VALUES($id, $variacao[0], $variacao[1], (SELECT dif_preco FROM tb_item_variacao WHERE id = $variacao[1]))");
      }

      $this -> commit();
    } catch(Exception $err) {
      $ret = $err;
      $this -> rollback();
    }
    return $ret;
  }

  public function removerProdutoCarrinho($objProduto){
    $sqlQuery = "UPDATE tb_produto_pedido pp 
                  INNER JOIN tb_pedido pe ON pe.id = pp.id_pedido 
                  SET pp.ativo = 0
                  WHERE pp.id = :id_produto_pedido
                  AND pe.id_cliente = :id_cliente
                  AND pe.id_restaurante = :id_restaurante
                  AND pe.session_id = :session_id;";
    $ret=$this->execute($sqlQuery,$objProduto);
    return $ret;
  }
  
  public function buscarProdutosCarrinho($objCarrinho) {
    $sqlQuery = "SELECT pe.id id_pedido, pr.id id_produto, pp.id id_produto_pedido, pp.qtde, pr.nome, 
                (pr.preco + (SELECT IFNULL(SUM(dif_preco),0) FROM tb_variacao_produto_pedido 
                    WHERE id_produto_pedido = pp.id)) * pp.qtde preco
                FROM tb_pedido pe 
                INNER JOIN tb_produto_pedido pp ON pe.id = pp.id_pedido 
                INNER JOIN tb_produto pr ON pp.id_produto = pr.id
                WHERE pp.ativo = 1 
                AND pe.id_restaurante = :id_restaurante
                AND pe.id_cliente = :id_usuario 
                AND pe.session_id = :session_id
                AND pe.id_status = 1;";
    $ret = $this->query($sqlQuery, $objCarrinho);
    return $ret;
  }
  
  public function buscarProdutoPedido($idProdutoPedido){
    $sqlQuery = "SELECT * FROM tb_produto_pedido WHERE id=? AND ativo=1";
    $ret = $this->query($sqlQuery, array($idProdutoPedido), TRUE);
    return $ret;
  }
}
?>